package com.soulgame;

import java.util.HashMap;
import java.util.Map;

import org.json.JSONObject;

import android.app.Activity;
import android.os.SystemClock;
import android.text.TextUtils;

import com.duoku.platform.single.DKPlatform;
import com.duoku.platform.single.DKPlatformSettings;
import com.duoku.platform.single.DkErrorCode;
import com.duoku.platform.single.DkProtocolKeys;
import com.duoku.platform.single.callback.IDKSDKCallBack;
import com.duoku.platform.single.item.GamePropsInfo;
import com.soul.sdk.SGProxy;
import com.soul.sdk.common.ActivityListenerAdapter;
import com.soul.sdk.constants.ResultCode;
import com.soul.sdk.constants.UserMapKey;
import com.soul.sdk.plugin.pay.IPayCallBack;
import com.soul.sdk.plugin.pay.PayParams;
import com.soul.sdk.plugin.user.IExitListener;
import com.soul.sdk.plugin.user.UserInfos;
import com.soul.sdk.plugin.user.UserProxy;
import com.soul.sdk.utils.SGDebug;
import com.soul.sdk.utils.json.KJSONObject;
import com.soulgame.sgsdkproject.sgtool.AmountUtils;
import com.soulgame.sgsdkproject.sgtool.ToastUtil;
import com.soulgame.sgsdkproject.sgtool.net.VolleyRequest;
import com.soulgame.utils.LoginTask;
import com.soulgame.utils.PayTask;
import com.soulgame.utils.Utils;

/**
 * @author lch
 * @version Create time：2017-1-3 类说明:
 */
public class BaiduSdk extends ActivityListenerAdapter {

	private static final BaiduSdk instance = new BaiduSdk();
	private Activity mActivity;
	private KJSONObject mSdkParamsJSON;
	private IDKSDKCallBack loginlistener;

	private Map<String, String> loginCustomParams = null;

	private BaiduSdk() {

	}

	public static BaiduSdk getInstance() {
		return instance;
	}

	public void init(Activity pActivity, KJSONObject pSdkParamsJSON) {
		SGDebug.d(this, "init");
		this.mActivity = pActivity;
		this.mSdkParamsJSON = pSdkParamsJSON;

		// 为此类(继承于 ActivityListenerAdapter) 添加 Activity 生命周期驱动监听
		SGProxy.getInstance().registerActivityListener(this);
		// SDK 存在退出对话框，这里记录一下。
		UserProxy.getInstance().setHasExitDialog(true);

		// 回调函数
		IDKSDKCallBack initcompletelistener = new IDKSDKCallBack() {
			@Override
			public void onResponse(String paramString) {

				SGDebug.d("initSDK paramString=" + paramString);

				try {
					JSONObject jsonObject = new JSONObject(paramString);
					// 返回的操作状态码
					int mFunctionCode = jsonObject.getInt(DkProtocolKeys.FUNCTION_CODE);

					// 初始化完成
					if (mFunctionCode == DkErrorCode.BDG_CROSSRECOMMEND_INIT_FINSIH) {
						initLogin();
						initAds();
					}

				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		};
		// 初始化函数
		DKPlatform.getInstance().init(mActivity, true, DKPlatformSettings.SdkMode.SDK_PAY, null, null, initcompletelistener);
	}

	/**
	 * 登陆初始化
	 */
	private void initLogin() {
		// 回调函数
		loginlistener = new IDKSDKCallBack() {
			@Override
			public void onResponse(String paramString) {
				try {

					SGDebug.d("登录返回onResponse paramString=" + paramString);

					JSONObject jsonObject = new JSONObject(paramString);
					// 返回的操作状态码
					int mFunctionCode = jsonObject.optInt(DkProtocolKeys.FUNCTION_CODE);
					// 返回的百度uid，供cp绑定使用
					String bduid = jsonObject.optString(DkProtocolKeys.BD_UID);

					// 登陆成功 ||快速注册成功\快速试玩登陆成功
					if (mFunctionCode == DkErrorCode.DK_ACCOUNT_LOGIN_SUCCESS
							|| mFunctionCode == DkErrorCode.DK_ACCOUNT_QUICK_REG_SUCCESS) {

						UserInfos pUserInfos = new UserInfos();
						pUserInfos.setUserId(bduid);

						// 通知登录成功回调
						SGProxy.getInstance().notifyLoginSuccess(pUserInfos, loginCustomParams);

						// 登录后通知自己服务端
						LoginTask.newInstance().doRequest(mActivity, bduid);

						// 登陆失败
					} else if (mFunctionCode == DkErrorCode.DK_ACCOUNT_LOGIN_FAIL) {

						// 通知登录失败回调
						SGProxy.getInstance().notifyLoginFail(ResultCode.CODE_LOGIN_FAIL, loginCustomParams);
					}

				} catch (Exception e) {
					e.printStackTrace();
				}

			}
		};
		DKPlatform.getInstance().invokeBDInit(mActivity, loginlistener);
	}

	/**
	 * 初始化宣品
	 */
	private void initAds() {
		DKPlatform.getInstance().bdgameInit(mActivity, new IDKSDKCallBack() {
			@Override
			public void onResponse(String paramString) {
				SGDebug.d("initAds bdgameInit  success");
			}
		});
	}

	// ===================================================
	// 登录相关操作 start
	// ===================================================
	public void login(Activity pActivity, Map<String, String> customParams) {
		SGDebug.d(this, "login");
		this.loginCustomParams = customParams;
		DKPlatform.getInstance().invokeBDLogin(mActivity, loginlistener);
	}

	public void switchLogin(Activity pActivity, Map<String, String> customParams) {
		this.loginCustomParams = customParams;
		// 切换账号接口（可选，与登陆共用一个接口）,用此接口，弹出百度登陆界面
		DKPlatform.getInstance().invokeBDLogin(mActivity, loginlistener);
	}

	// ===================================================
	// 支付 start
	// ===================================================
	public void pay(Activity pActivity, final PayParams pPayParams, final IPayCallBack pPayCallBack) {
		SGDebug.d(this, "pay");
		if (pPayParams == null || pPayCallBack == null) {
			ToastUtil.showShort(mActivity, "PayParams & IPayCallBack 均不能为 null");
			return;
		}
		/*
		 * String mPropsId, //百度移动游戏计费点ID，在dev.mgame.baidu.com申请 String mPrice,
		 * //计费点价格 String mTitle, //计费点名称 String thirdpay
		 * //只接入第三方支付（支付宝、微信支付等）的，
		 * 将此值设为"qpfangshua"，调用方法setThirdPay(String)。接短代支付的请忽略此参数。 String
		 * mUserdata //用户透传字段(不大于11位,不能传中文，不包含 , . _ # - 五种符号，字段中不能包含null四个字符)
		 */
		String mPropsId = "";
		String mPrice = "";
		String mTitle = "";
		String app_product_id = pPayParams.getProductId(); // 应用定义的产品id
		String app_order_id = pPayParams.getAppOrderId();// 应用订单号
		//
		VoPayParam aVoPayParam = new VoPayParam(mSdkParamsJSON);
		mPropsId = aVoPayParam.getPayCode(app_product_id);
		mTitle = aVoPayParam.getPayProductName(app_product_id);
		mPrice = aVoPayParam.getPayPrice(app_product_id);

		// 由于百度支付时没得传自定义 透传参数，为了绑定数字，这里用透传参数当订单号，百度规定不能大于11位。
		String extOrderId = Utils.getCharAndNumr(11);

		if (TextUtils.isEmpty(extOrderId)) {
			extOrderId = SystemClock.uptimeMillis() + "";
		}

		SGDebug.w("================pay info start================");
		SGDebug.d("app_product_id = " + app_product_id);
		SGDebug.d("mPropsId = " + mPropsId);
		SGDebug.d("mPrice = " + mPrice);
		SGDebug.d("mTitle = " + mTitle);
		SGDebug.d("extOrderId = " + extOrderId);
		SGDebug.w("================pay info end================");

		// 支付前请求
		PayTask.newInstance().doRequest(mActivity, app_order_id, app_product_id, pPayParams.getPrice() + "",
				pPayParams.getUserId(), extOrderId);

		GamePropsInfo pPropsInfo = new GamePropsInfo(mPropsId, mPrice, mTitle, extOrderId);
		// 只接入第三方支付（支付宝、微信支付等）的，将此值设为"qpfangshua"，调用方法setThirdPay(String)。
		pPropsInfo.setThirdPay("qpfangshua");

		DKPlatform.getInstance().invokePayCenterActivity(mActivity, pPropsInfo, null, null, null, null,
				getDKSDKCallBack(pPayParams, pPayCallBack));
	}

	/**
	 * 支付处理过程的结果回调函数
	 * */
	private IDKSDKCallBack getDKSDKCallBack(final PayParams pPayParams, final IPayCallBack pPayCallBack) {

		return new IDKSDKCallBack() {
			@Override
			public void onResponse(String paramString) {

				SGDebug.d("RechargeCallback paramString=" + paramString);

				try {
					JSONObject jsonObject = new JSONObject(paramString);
					// 支付状态码
					int mStatusCode = jsonObject.optInt(DkProtocolKeys.FUNCTION_STATUS_CODE);

					if (mStatusCode == DkErrorCode.BDG_RECHARGE_SUCCESS) {
						SGDebug.i("道具购买成功!");
						// 支付成功回调
						pPayCallBack.onSuccess(ResultCode.CODE_PAY_SUCCESS, ResultCode.getMessage(ResultCode.CODE_PAY_SUCCESS),
								pPayParams);

					} else if (mStatusCode == DkErrorCode.BDG_RECHARGE_USRERDATA_ERROR) {
						SGDebug.print_w("用户透传数据不合法");
						// 支付失败回调
						pPayCallBack.onFail(ResultCode.CODE_PAY_FAIL, "用户透传数据不合法", pPayParams);

					} else if (mStatusCode == DkErrorCode.BDG_RECHARGE_ACTIVITY_CLOSED) {
						// 返回玩家手动关闭支付中心的状态码，开发者可以在此处理相应的逻辑
						SGDebug.w("玩家关闭支付中心");
						// 取消支付失败回调
						pPayCallBack.onFail(ResultCode.CODE_PAY_CANCEL, "玩家关闭支付中心", pPayParams);

					} else if (mStatusCode == DkErrorCode.BDG_RECHARGE_FAIL) {
						// 返回支付失败的状态码，开发者可以在此处理相应的逻辑
						SGDebug.w("购买失败");
						// 支付失败回调
						pPayCallBack.onFail(ResultCode.CODE_PAY_FAIL, ResultCode.getMessage(ResultCode.CODE_PAY_FAIL),
								pPayParams);

					} else if (mStatusCode == DkErrorCode.BDG_RECHARGE_EXCEPTION) {
						// 返回支付出现异常的状态码，开发者可以在此处理相应的逻辑
						SGDebug.w("购买失败");
						// 支付失败回调
						pPayCallBack.onFail(ResultCode.CODE_PAY_FAIL, ResultCode.getMessage(ResultCode.CODE_PAY_FAIL),
								pPayParams);

					} else if (mStatusCode == DkErrorCode.BDG_RECHARGE_CANCEL) {
						// 返回取消支付的状态码，开发者可以在此处理相应的逻辑
						SGDebug.w("玩家取消支付");
						// 取消支付回调
						pPayCallBack.onFail(ResultCode.CODE_PAY_CANCEL, ResultCode.getMessage(ResultCode.CODE_PAY_CANCEL),
								pPayParams);

					} else {
						SGDebug.w("未知情况");
						// 支付失败回调
						pPayCallBack.onFail(ResultCode.CODE_PAY_FAIL, ResultCode.getMessage(ResultCode.CODE_PAY_FAIL),
								pPayParams);
					}

				} catch (Exception e) {
					// 支付失败回调
					pPayCallBack.onFail(ResultCode.CODE_PAY_FAIL, "支付结果解析报错", pPayParams);
				}
			}
		};
	}

	// ===================================================
	// 支付 end
	// ===================================================

	// ===================================================
	// Activity 生命周期 （按需实现），要添加监听
	// ：SGProxy.getInstance().addActivityListener(this);
	// ===================================================
	@Override
	public void onPause() {
		super.onPause();
		SGDebug.d(this, "onPause");
	}

	@Override
	public void onResume() {
		super.onResume();
		SGDebug.d(this, "onResume");
	}

	@Override
	public void onStop() {
		super.onStop();
	}

	@Override
	public void onDestroy() {
		super.onDestroy();
		// 退出程序前 结束网络请求
		VolleyRequest.stopRequest(mActivity);
		SGDebug.d(this, "onDestroy");
	}

	// ===================================================
	// 退出
	// ===================================================
	public void exit(final Activity pActivity, final Map<String, String> customParams, final IExitListener pExitListener) {
		SGDebug.d(this, "exit");
		DKPlatform.getInstance().bdgameExit(pActivity, new IDKSDKCallBack() {
			@Override
			public void onResponse(String paramString) {
				if (pExitListener != null) {
					// 渠道存在退出界面
					Map<String, String> mExitMap = null;
					if (customParams != null) {
						mExitMap = customParams;
					} else {
						mExitMap = new HashMap<String, String>();
					}
					// 因已弹百度退出对话框，所以这里做好标记回传。若无退出对话框则无需下面一句。
					mExitMap.put(UserMapKey.IS_CONTAIN_EXIT_DIALOG, "true");
					// 把传入的 customParams 加上上面一句退出框标记透传回去。
					pExitListener.onExit(mExitMap);
				}
			}
		});

	}

}
